//
//  MLSHomeController.swift
//  MLSMircoBlog
//
//  Created by 袁航 on 15/7/27.
//  Copyright © 2015年 yuanhang. All rights reserved.
//

import UIKit
import SVProgressHUD
// 重用cellID
private let reuseID = "statusCell"
private let tipLabelHeight: CGFloat = 30
private let tipLabelOffsetY: CGFloat = 44
class MLSHomeController: MLSBasicTableViewController {

    /// 数据模型数组
    private var statusList: [MLSUserStatus]? {
        didSet{
            // 赋值过后,刷新表格
            tableView.reloadData()
        }
    }
    // MAKR:- 系统方法
    override func viewDidLoad() {
        super.viewDidLoad()
        // 判断用户是否登录,如果没有登录,设置访客模式界面
        if !MLSAccessToken.userLogon {
            vistroView.setUIInfo(true, centerImageName: "visitordiscover_feed_image_smallicon", tipString: "关注一些人，回这里看看有什么惊喜")
            return
        }
        // 设置tableview基本属性
        setTableViewBasic()
        // 加载数据(要放到最后刷新数据)
        loadStatus()
        
    }
    
    //MARK:- 设置tableView的基本属性
    private func setTableViewBasic() {
        // 注册cell
        tableView.registerClass(MLSTransCell.self, forCellReuseIdentifier: statusCellType.transCell.rawValue)
        tableView.registerClass(MLSNormalCell.self, forCellReuseIdentifier: statusCellType.normallCell.rawValue)
        // 设置预估行高,减少调用行高代理方法的次数
        tableView.estimatedRowHeight = 300
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        tableView.backgroundColor = UIColor(white: 0.9, alpha: 1)
        // 设置下拉刷新控件(自定义)
        refreshControl = MLSRefreshView()
        refreshControl?.addTarget(self, action: "loadStatus", forControlEvents: UIControlEvents.ValueChanged)
    }
    
    // 定义上拉刷新标记
    var pullUpDataFlag = false
    ///  加载数据
    func loadStatus() {
        // 提示加载数据
        refreshControl?.beginRefreshing()
        
        // 如果是第一次,statusList为空
        /// 返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        var since_id: Int = statusList?.first?.id ?? 0
        /// 则返回ID小于或等于max_id的微博，默认为0。
        var max_id: Int = 0
        if pullUpDataFlag {
            since_id = 0
            max_id = statusList?.last?.id ?? 0
        }
        
        // 加载数据 (使用weak self, 防止循环引用)
        MLSUserStatus.loadStatus(since_id, max_id:max_id) { (statusList, error) -> () in
            // 结束刷新控件
            self.refreshControl?.endRefreshing()
            // 复位上拉刷新标记
            self.pullUpDataFlag = false
            // 如果错误,打印输出错误,返回
            if error != nil {
                // 会提示网络错误,并关闭显示
                SVProgressHUD.showErrorWithStatus("网络请求错误")
                print(error)
                return
            }
            // 记录刷新数据的个数
            let count = statusList?.count ?? 0
            // 如果没有刷新到数据,直接返回
            if count == 0 {
                // 提示没有刷新到数据
                self.showTipView(count)
                return
            }
            
            // 如果是上拉刷新数据,提示用户
            if since_id > 0 {
                self.showTipView(count)
                self.statusList = statusList! + self.statusList!
            } else if max_id > 0 {
                self.statusList! += statusList!
            } else {
                self.statusList = statusList
            }
        }
    }
    
    // MARK: - 提示刷新数据个数控件
    private func showTipView(count: Int) {
        tipLabel.text = (count == 0) ? "没有刷新到数据" : "刷新了\(count)条数据"
        let rect = tipLabel.frame
        UIView.animateWithDuration(1, animations: { () -> Void in
            // 自动反转动画
            UIView.setAnimationRepeatAutoreverses(true)
            self.tipLabel.frame.size.height = tipLabelHeight
            }) { (_) -> Void in
                self.tipLabel.frame = rect
        }
    }
    // 懒加载控件
    private lazy var tipLabel: UILabel = {
        let label = UILabel(color: UIColor.whiteColor(), fontSize: 14)
        label.frame = CGRect(x: 0, y: tipLabelOffsetY, width: UIScreen.mainScreen().bounds.width, height: 0)
        label.backgroundColor = UIColor.orangeColor()
        label.textAlignment = NSTextAlignment.Center
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        return label
    }()
}

//MARK:- 数据源方法
extension MLSHomeController {
    
    // MARK:- 数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 如果statusList有值,返回数组count, 没有值,返回0
        return statusList?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let status = statusList![indexPath.row]
        // 获取cell(此方法能够保证一定取到cell,如果取不到,程序会崩溃)
        let cell = tableView.dequeueReusableCellWithIdentifier(statusCellType.cellType(status), forIndexPath: indexPath) as! MLSStatusCell
        
        // 判断是否到下拉刷新的地方
        if indexPath.row == statusList!.count - 3 {
            pullUpDataFlag = true
            // 刷新数据
            loadStatus()
        }
        
        cell.status = status
        
        return cell
    }
}
//MARK:- 代理方法
extension MLSHomeController {
    //MARK:- 代理方法
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }
    // 计算行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 获取对应模型
        let status = statusList![indexPath.row]
        if let h = status.rowHeight {
            return h
        }
        // 获取一个cell
        let cell = tableView.dequeueReusableCellWithIdentifier(statusCellType.cellType(status)) as! MLSStatusCell
        let height = cell.rowHeight(status)
        // 给cell 赋值模型
        return height
    }
}
